#ifndef CLOUD_COLOR
#define CLOUD_COLOR
#include "CloudShape.cginc"
#include "VertStruct.cginc"
#include "CloudShadow.cginc"

float4 _color_adjust; // 只与颜色相关
float3 _sky_color;
float3 _cloud_color;
float4 _shadow_parm;
float3 _emission_color;
float4 _phase_params;


float4 calculate_color(float3 ray_origin, float3 ray_dir, float depth, float3 light_dir, float3 soft_shadow)
{
    // 重写一遍ray_marching
    if (!any(light_dir == float3(0, 0, 0))) // 是否采样面板上的光方向
        light_dir = -_WorldSpaceLightPos0.xyz;
    const float3 start_pos = ray_origin + ray_dir * depth; // 世界空间云位置那个点
    // return float4(distance_field_c(start_pos, 99999), 1.0);

    // 漫反射
    const float ray_dot_light = dot(ray_dir, -light_dir);
    float travel_length = 0.0;
    float step_length = 0.3125;
    for (int i = 0; i < 5; i++)
    {
        const float3 offset_pos = start_pos - (light_dir * step_length * _cloud_scale); // 初始距离沿着光线方向偏移，偏移越来越远
        const float t = depth + step_length * ray_dot_light; // 
        const float value = distance_field(offset_pos, t); // 得到当前位置到距离场的距离
        const float noise = sample_noise(offset_pos); // offset去采样噪声
        const float result = value - noise;
        const float key_one = step(0.5, i) + 1.0;
        travel_length += _color_adjust.w * max(0.0, 0.05 - (0.35 * key_one) * result / 100);
        step_length *= 2.0;
    }
    //TODO: 边缘检测，透明度
    // float k = 5;
    // float test = 0.0;
    // for (int i = 0; i < 5; i++)
    // {
    //     k *= 1.5;
    //     float3 t_pos = start_pos + ray_dir * _cloud_scale * k;
    //     test += distance_field(t_pos, depth) * k / 5;
    // }
    // return float4(clamp(test.xxx / 200, 0, 1), 1.0);


    // 采样噪声
    const float noise = sample_noise(start_pos) / _cloud_scale;


    // 体积阴影
    // float3 shadow = hard_shadow(start_pos);
    // float3 shadow = fragPCF4x4(start_pos);
    float3 shadow = soft_shadow;
    // shadow.y = 1;
    // shadow.z = 1;
    // return float4(shadow.xxx, 1.0); // 受光遮罩
    // return float4(shadow.yyy, 1.0); // 光源散射距离
    // return float4(shadow.zzz, 1.0); // 到光源绝对距离/50000
    // return float4((shadow.y * shadow.z).xxx, 1.0);  // 比尔？

    // func1
    const float const1 = 0.25;
    const float const2 = 1.0;
    float exp_noise = 5.0 * exp2(((-3.0) * (1.0 + const1)) * (0.5 + (0.5 * noise)));

    // 也是透光效果
    const float phase_val = phase(ray_dot_light, _phase_params);
    // return float4(phase_val.xxx/10, 1.0);


    // func2 向光亮，背光暗，fbm总和距离开根号
    const float cloud_diffuse = const2 * exp2((-2.75) * sqrt(travel_length));
    // 太阳位置透射强度
    const float dir_light_mask = clamp(shadow.x, 0, 1);
    const float what3 = lerp(0.2, 0.005, cloud_diffuse * dir_light_mask);
    // return float4(what3.xxx, 1.0);
    float transmission = what3 / (what3 - (ray_dot_light - 1.0));
    transmission /= (what3 * log(2 / what3 + 1.0));
    // return float4(transmission.xxx, 1.0);
    const float edgeBackSS = 5 * transmission * (cloud_diffuse * (dir_light_mask + 0.2) + 0.5) * (0.5 + 0.5 * dir_light_mask) * (_shadow_parm.x - shadow.z) * phase_val;
    // return float4(transmission.xxx, 1.0);
    // return float4(edgeBackSS.xxx, 1.0);

    // 比尔定律的阴影遮罩
    // const float beer_atten = beer_sugar((shadow.z-0.2)*10);
    const float beer_atten = beer_sugar((shadow.z)/1000-3);
    const float3 dir_light = beer_atten * _cloud_color * dir_light_mask * cloud_diffuse * exp_noise + edgeBackSS;
    // return float4(beer_atten.xxx, 1.0);
    // return float4((dir_light)/10, 1.0);
    // return float4(edgeBackSS.xxx / 10, 1.0);
    // return float4(beer_atten.xxx / 10, 1.0);

    // 
    const float col_lerp = 0.6;
    const float3 env_color = lerp(_sky_color, _cloud_color, col_lerp); // col_lerp越大，越是云的颜色，越小，越是天的颜色
    const float remove_highlight_noise = lerp(0.75, 0.5 + 0.5 * noise, 0.2 + 0.8 * dir_light_mask); // 暗部无明显噪声
    // return float4(remove_highlight_noise.xxx/2, 1.0);
    const float3 shadow_color = _cloud_color * 0.5 * col_lerp * cloud_diffuse * dir_light_mask; // 
    const float3 face_light_color = (1.0 + 0.5 * exp_noise).xxx;
    float3 ambent_light = env_color * (remove_highlight_noise * face_light_color + shadow_color);
    // return float4(shadow_color/5, 1.0);
    // return float4(sample_light/10, 1.0);

    // return float4(shadow.zzz/2, 1.0);

    float3 color = _color_adjust.xyz * dir_light + ambent_light * 0.1;
    // float3 color = _adjust8.xyz * (sample_light);
    // float3 color = _adjust8.xyz * (light + sample_light);
    // return float4(sample_light * light, 1.0);
    // return float4(travel_length.xxx, 1);
    // return float4(cloud_diffuse.xxx, 1);
    return float4(color, 1);
    // return float4(color, 1-clamp(test/200, 0, 1));
    

    // 向光遮罩
    const float face_sun = clamp(what3 / (_emission_color.z - what3), 0, 100);
    // return face_sun;   

    // exp_noise = exp_noise * clamp(1 - face_sun, 0.1, 0.9);
    // return exp_noise;
    // const float3 ambient = env_color * cloud_diffuse * exp_noise * 0.5;
    // const float3 dir_light = 5 * cloud_diffuse * transmission * beer_atten; // 光向高光
    // const float3 col = _adjust8.xyz * (ambient + dir_light);


    // return _adjust8.xyz * ambient * dir_light;
    // return what3;
    // return float4(col, 1.0);
}


#endif
